class Solution {
    public:
        vector<int> minReverseOperations(int n, int p, vector<int>& banned, int k) {
            unordered_set<int> ban{banned.begin(), banned.end()};
            set<int> indices[2];
            for (int i = 0; i < n; i++) {
                if (i != p && ban.find(i) == ban.end()) {
                    indices[i % 2].insert(i);
                }
            }
            indices[0].insert(n); // 哨兵，下面无需判断 it != st.end()
            indices[1].insert(n);
    
            vector<int> ans(n, -1);
            ans[p] = 0; // 起点
            queue<int> q;
            q.push(p);
            while (!q.empty()) {
                int i = q.front(); q.pop();
                int mn = max(i - k + 1, k - i - 1);
                int mx = min(i + k - 1, n * 2 - k - i - 1);
                set<int>& st = indices[mn % 2];
                //lower_bound函数的返回值是一个指针，指针指向的是容器中第一个大于等于lower_bound函数参数的对象
                for (auto it = st.lower_bound(mn); *it <= mx; it = st.erase(it)) {
                    //it是指针，*it是指针指向的int的值，因为it是set<int>& st的指针
                    ans[*it] = ans[i] + 1; // 移动一步
                    q.push(*it);
                    //it = st.erase(it)是重点，一个节点如果已经被遍历过了，那么说明已经可以到达了，
                    // 又因为图中边长都是1，不需要考虑权来计算最短路径，因此已经到达的节点不要重复计算，所以从哈希表中删除
                }
            }
            return ans;
        }
    };
    //参考自https://leetcode.cn/problems/minimum-reverse-operations/solutions/2204092/liang-chong-zuo-fa-ping-heng-shu-bing-ch-vr0z/?envType=daily-question&envId=2025-03-20